package models;

import java.util.List;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
import com.avaje.ebean.Ebean;
import com.avaje.ebean.Page;
import play.data.validation.Constraints;
import play.db.ebean.Model;

/**
 * Modele de l'objet Choix. Un choix est relié à une question, et peut être
 * juste ou faux.
 * 
 * @author ProjetSI-QCM
 * 
 */
@SuppressWarnings("serial")
@Entity
public class Choix extends Model {

	/**
	 * Identifiant du Choix.
	 */
	@Id
	private Long idChoix;

	/**
	 * Référence vers la Question.
	 */
	@ManyToOne
	private Question question;

	/**
	 * Descriptif du Choix.
	 */
	@Constraints.Required
	private String descriptifChoix;

	/**
	 * True : Le choix fait partie des bonnes réponses à la question. False : Le
	 * choix est une mauvaise réponse.
	 */
	@Constraints.Required
	private Boolean estVrai;

	/**
	 * Finder de la classe Choix.
	 */
	private static Finder<Long, Choix> find = new Finder<Long, Choix>(
			Long.class, Choix.class);

	/**
	 * La méthode permet de retrouver un Choix à partir de son ID.
	 * 
	 * @param id
	 *            L'identifiant du Choix
	 * @return Choix L'objet Choix.
	 */
	public static Choix findById(final Long id) {
		return Ebean.find(Choix.class, id);
	}

	/**
	 * Permet de récupérer la liste des Choix correspondants à une Question.
	 * 
	 * @param question
	 *            La Question
	 * @return List<Choix> La liste des Choix correspondants à la Question
	 */
	public static List<Choix> findByQuestion(final Question question) {
		return find.where().eq("question", question).findList();
	}

	/**
	 * Permet de récupérer tous les Choix.
	 * 
	 * @return List<Choix>
	 */
	public static List<Choix> findAll() {
		return find.all();
	}

	/**
	 * Permet de créer l'Objet dans la Base de Données.
	 * 
	 * @param choix
	 *            L'Objet a créer
	 */
	public static void create(final Choix choix) {
		choix.save();
	}

	/**
	 * Permet de mettre à jour un Objet dans la Base de Données.
	 * 
	 * @param choix
	 *            L'objet à modifier.
	 */
	public static void update(final Choix choix) {
		choix.update();
	}

	/**
	 * Permet de supprimer un Objet de la base de données.
	 * 
	 * @param id
	 *            Identifiant du Choix
	 */
	public static void delete(final Long id) {
		Choix choix = Choix.findById(id);
		for (UtilisateurQcm utilisateurQcm : UtilisateurQcm.findAll()) {
			if (utilisateurQcm.getListeChoixUtilisateur().contains(choix)) {
				utilisateurQcm.getListeChoixUtilisateur().remove(choix);
				UtilisateurQcm.update(utilisateurQcm);
			}
		}
		find.ref(id).delete();
	}

	/**
	 * Retourne une Page de Choix.
	 * 
	 * @param page
	 *            Page à afficher
	 * @param pageSize
	 *            Nombre d'objets par page
	 * @param sortBy
	 *            Propriété utilisée pour le tri
	 * @param order
	 *            Sens du tri (asc ou desc)
	 * @param filter
	 *            Filtre appliqué sur le nom de la colonne
	 * @return Page<Choix> la page
	 */
	public static Page<Choix> page(final int page, final int pageSize,
			final String sortBy, final String order, final String filter) {
		return find.where().ilike("idChoix", "%" + filter + "%")
				.orderBy(sortBy + " " + order).fetch("question")
				.findPagingList(pageSize).setFetchAhead(false).getPage(page);
	}

	/**
	 * @return the idChoix
	 */
	public final Long getIdChoix() {
		return idChoix;
	}

	/**
	 * @param id the idChoix to set
	 */
	public final void setIdChoix(final Long id) {
		this.idChoix = id;
	}

	/**
	 * @return the question
	 */
	public final Question getQuestion() {
		return question;
	}

	/**
	 * @param q the question to set
	 */
	public final void setQuestion(final Question q) {
		this.question = q;
	}

	/**
	 * @return the descriptifChoix
	 */
	public final String getDescriptifChoix() {
		return descriptifChoix;
	}

	/**
	 * @param desc the descriptifChoix to set
	 */
	public final void setDescriptifChoix(final String desc) {
		this.descriptifChoix = desc;
	}

	/**
	 * @return the estVrai
	 */
	public final Boolean getEstVrai() {
		return estVrai;
	}

	/**
	 * @param b the estVrai to set
	 */
	public final void setEstVrai(final Boolean b) {
		this.estVrai = b;
	}


}
